//给你一个整数数组 nums ，你需要找出一个 连续子数组 ，如果对这个子数组进行升序排序，那么整个数组都会变为升序排序。 
//
// 请你找出符合题意的 最短 子数组，并输出它的长度。 
//
// 
//
// 
// 
// 示例 1： 
// 
// 
//
// 
//输入：nums = [2,6,4,8,10,9,15]
//输出：5
//解释：你只需要对 [6, 4, 8, 10, 9] 进行升序排序，那么整个表都会变为升序排序。
// 
//
// 示例 2： 
//
// 
//输入：nums = [1,2,3,4]
//输出：0
// 
//
// 示例 3： 
//
// 
//输入：nums = [1]
//输出：0
// 
//
// 
//
// 提示： 
//
// 
// 1 <= nums.length <= 10⁴ 
// -10⁵ <= nums[i] <= 10⁵ 
// 
//
// 
//
// 进阶：你可以设计一个时间复杂度为 O(n) 的解决方案吗？ 
//
// Related Topics 栈 贪心 数组 双指针 排序 单调栈 👍 1190 👎 0

package leetcode.editor.cn;
//java:最短无序连续子数组
public class Q0581ShortestUnsortedContinuousSubarray {
    public static void main(String[] args){
        Solution solution = new Q0581ShortestUnsortedContinuousSubarray().new Solution();
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int findUnsortedSubarray(int[] nums) {
        int max = Integer.MIN_VALUE, min = Integer.MAX_VALUE;
        int n = nums.length, left = -1, right = -1;
        for (int i = 0; i < n; i++) {
            // 由左至右找局部最大值，如果右边的比左边的小，即小于之前的局部最大值，说明是乱序的
            if (max > nums[i]) {
                // 乱序
                right = i;
            } else {
                // 如果大于就更新局部最大值
                max = nums[i];
            }
        }

        for (int i = n - 1; i >= 0; i--) {
            // 由右至左找局部最小值，如果左边的比右边的大，即大于之前的局部最小值，说明是乱序的
            if (min < nums[i]) {
                // 乱序
                left = i;
            } else {
                // 如果小于就更新局部最小值
                min = nums[i];
            }
        }
        // 特判本来就是否有序
        return left == -1 && right == -1 ? 0 : right - left + 1;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}